{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 逻辑回归代码实现(正则化)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    "from sklearn.metrics import accuracy_score"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 加载数据的函数"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "outputs": [],
   "source": [
    "def loaddata():\n",
    "    data = np.loadtxt('data/data1.txt',delimiter=',')\n",
    "    n = data.shape[1] - 1  # 特征数\n",
    "    X = data[:, 0:n]\n",
    "    y = data[:, -1].reshape(-1, 1)\n",
    "    return X, y"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 画散点图"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "outputs": [],
   "source": [
    "def plot(X,y):\n",
    "    pos = np.where(y==1)\n",
    "    neg = np.where(y==0)\n",
    "    plt.scatter(X[pos[0],0],X[pos[0],1],marker='x')\n",
    "    plt.scatter(X[neg[0], 0], X[neg[0], 1], marker='o')\n",
    "    plt.xlabel('Exam 1 score')\n",
    "    plt.ylabel('Exam 2 score')\n",
    "    plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X,y = loaddata()\n",
    "plot(X,y)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 实现sigmoid函数\n",
    "<img src=\"images/01.png\" width=\"200\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    r = 1/(1+np.exp(-z))\n",
    "    return r"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 实现假设函数\n",
    "<img src=\"images/02.png\" width=\"200\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "outputs": [],
   "source": [
    "def hypothesis(X,theta):\n",
    "    z=np.dot(X,theta)\n",
    "    return sigmoid(z)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 损失函数\n",
    "<img src=\"images/03.png\" width=\"250\" align=\"left\"/>\n",
    "<br/>\n",
    "<font color='red'>成本函数（改变处）</font>\n",
    "<br/>\n",
    "\n",
    "<img src=\"images/05.png\" width=\"400\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "outputs": [],
   "source": [
    "#多传入lambda\n",
    "def computeCost(X,y,theta,lambd):\n",
    "    m = X.shape[0]\n",
    "    z = -1*y*np.log(hypothesis(X,theta))-(1-y)*np.log(1-hypothesis(X,theta))\n",
    "    return np.sum(z)/m+(lambd/(2*m))*np.sum(np.power(theta,2))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### <font color='red'>梯度下降法求解(有变化)</font>\n",
    "<img src=\"images/04.png\" width=\"250\" align=\"left\"/>\n",
    "<br>\n",
    "<br>\n",
    "改变为：\n",
    "\n",
    "<img src=\"images/06.png\" width=\"250\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [],
   "source": [
    "def gradientDescent(X,y,theta,iterations,alpha,lambd):\n",
    "    #取数据条数\n",
    "    m = X.shape[0]\n",
    "    #在x最前面插入全1的列\n",
    "    X = np.hstack((np.ones((m, 1)), X))\n",
    "    for i in range(iterations):\n",
    "        for j in range(len(theta)):\n",
    "            #theta[j] = theta[j]-(alpha/m)*np.sum((hypothesis(X,theta) - y)*X[:,j].reshape(-1,1))\n",
    "            theta[j] = theta[j]-(alpha/m)*(np.sum((hypothesis(X,theta) - y)*X[:,j].reshape(-1,1))+lambd* theta[j])\n",
    "        #每迭代1000次输出一次损失值\n",
    "        if(i%10000==0):\n",
    "            print('第',i,'次迭代，当前损失为：',computeCost(X,y,theta,lambd),'theta=',theta)\n",
    "    return theta"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 预测函数"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "outputs": [],
   "source": [
    "def predict(X):\n",
    "    # 在x最前面插入全1的列\n",
    "    c = np.ones(X.shape[0]).transpose()\n",
    "    X = np.insert(X, 0, values=c, axis=1)\n",
    "    #求解假设函数的值\n",
    "    h = hypothesis(X,theta)\n",
    "    #根据概率值决定最终的分类,>=0.5为1类，<0.5为0类\n",
    "    h[h>=0.5]=1\n",
    "    h[h<0.5]=0\n",
    "    return h"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "outputs": [],
   "source": [
    "X,y = loaddata()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "outputs": [],
   "source": [
    "n = X.shape[1]#特征数\n",
    "theta = np.zeros(n+1).reshape(n+1, 1)  # theta是列向量,+1是因为求梯度时X前会增加一个全1列\n",
    "iterations = 250000\n",
    "alpha = 0.008"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第 0 次迭代，当前损失为： 3.4898211734024334 theta= [[ 0.0008    ]\n",
      " [ 0.0959687 ]\n",
      " [-0.17080118]]\n",
      "第 10000 次迭代，当前损失为： 1.742800591795805 theta= [[-5.97396642]\n",
      " [ 0.03494948]\n",
      " [ 0.00734691]]\n",
      "第 20000 次迭代，当前损失为： 1.6350296421727863 theta= [[-10.99045142]\n",
      " [ -0.0957601 ]\n",
      " [  0.25509445]]\n",
      "第 30000 次迭代，当前损失为： 1.2755309233391 theta= [[-14.47603256]\n",
      " [  0.24101975]\n",
      " [  0.08375873]]\n",
      "第 40000 次迭代，当前损失为： 0.9171076789517963 theta= [[-17.43209425]\n",
      " [  0.26455879]\n",
      " [  0.08760486]]\n",
      "第 50000 次迭代，当前损失为： 0.7870734058134988 theta= [[-19.33019256]\n",
      " [  0.1848856 ]\n",
      " [  0.1962559 ]]\n",
      "第 60000 次迭代，当前损失为： 0.7678570762112327 theta= [[-20.65128186]\n",
      " [  0.3170618 ]\n",
      " [  0.04350708]]\n",
      "第 70000 次迭代，当前损失为： 0.5480573979988327 theta= [[-21.59058274]\n",
      " [  0.09375762]\n",
      " [  0.23119576]]\n",
      "第 80000 次迭代，当前损失为： 0.5252331725834901 theta= [[-22.35637706]\n",
      " [  0.11682465]\n",
      " [  0.27621063]]\n",
      "第 90000 次迭代，当前损失为： 0.5338996369673558 theta= [[-22.96485411]\n",
      " [  0.28047518]\n",
      " [  0.08323508]]\n",
      "第 100000 次迭代，当前损失为： 0.4656598627829162 theta= [[-23.45384231]\n",
      " [  0.11660825]\n",
      " [  0.27483063]]\n",
      "第 110000 次迭代，当前损失为： 0.38610073479527657 theta= [[-23.8389841 ]\n",
      " [  0.21008919]\n",
      " [  0.21305452]]\n",
      "第 120000 次迭代，当前损失为： 0.4191934240021029 theta= [[-24.1433255 ]\n",
      " [  0.27666663]\n",
      " [  0.14013568]]\n",
      "第 130000 次迭代，当前损失为： 0.3575964833997531 theta= [[-24.38411957]\n",
      " [  0.14302413]\n",
      " [  0.24194373]]\n",
      "第 140000 次迭代，当前损失为： 0.34627927629320376 theta= [[-24.56753515]\n",
      " [  0.22300429]\n",
      " [  0.20671332]]\n",
      "第 150000 次迭代，当前损失为： 0.3660485164508709 theta= [[-24.70994973]\n",
      " [  0.23088081]\n",
      " [  0.14543833]]\n",
      "第 160000 次迭代，当前损失为： 0.3241458479086377 theta= [[-24.81913813]\n",
      " [  0.16087509]\n",
      " [  0.22485146]]\n",
      "第 170000 次迭代，当前损失为： 0.32714208967507863 theta= [[-24.89958227]\n",
      " [  0.24000659]\n",
      " [  0.19020067]]\n",
      "第 180000 次迭代，当前损失为： 0.3054592163407034 theta= [[-24.96184358]\n",
      " [  0.19746902]\n",
      " [  0.23072786]]\n",
      "第 190000 次迭代，当前损失为： 0.31820272966878566 theta= [[-25.00741744]\n",
      " [  0.2375324 ]\n",
      " [  0.19329859]]\n",
      "第 200000 次迭代，当前损失为： 0.3273561243941825 theta= [[-25.04162387]\n",
      " [  0.25808419]\n",
      " [  0.16673773]]\n",
      "第 210000 次迭代，当前损失为： 0.3101333515604361 theta= [[-25.06871986]\n",
      " [  0.16083039]\n",
      " [  0.25064563]]\n",
      "第 220000 次迭代，当前损失为： 0.3234168745113324 theta= [[-25.08625778]\n",
      " [  0.25905906]\n",
      " [  0.16374   ]]\n",
      "第 230000 次迭代，当前损失为： 0.30495215144877946 theta= [[-25.10169164]\n",
      " [  0.16646131]\n",
      " [  0.25053326]]\n",
      "第 240000 次迭代，当前损失为： 0.30516257920744394 theta= [[-25.11216047]\n",
      " [  0.16454622]\n",
      " [  0.25041135]]\n",
      "theta=\n",
      " [[-25.11944059]\n",
      " [  0.21193097]\n",
      " [  0.17255222]]\n"
     ]
    }
   ],
   "source": [
    "theta = gradientDescent(X,y,theta,iterations,alpha,0.01)\n",
    "print('theta=\\n',theta)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 画决策边界"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "outputs": [],
   "source": [
    "def plotDescisionBoundary(X,y,theta):\n",
    "    cm_dark = mpl.colors.ListedColormap(['g', 'r'])\n",
    "    plt.xlabel('Exam 1 score')\n",
    "    plt.ylabel('Exam 2 score')\n",
    "    plt.scatter(X[:,0],X[:,1],c=np.array(y).squeeze(),cmap=cm_dark,s=30)\n",
    "\n",
    "    #化分类决策面 theta0+theta1*x1+theta2*x2 = 0\n",
    "    # x1 = np.arange(20,110,0.1)\n",
    "    x1 = np.arange(min(X[:, 0]), max(X[:, 0]), 0.1)\n",
    "    x2 = -(theta[1]*x1+theta[0])/theta[2]\n",
    "    plt.plot(x1,x2)\n",
    "    plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotDescisionBoundary(X,y,theta)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确度： 0.88\n",
      "准确度： 0.88\n"
     ]
    }
   ],
   "source": [
    "p = predict(X)\n",
    "print('准确度：',np.mean(p==y))\n",
    "print('准确度：',accuracy_score(y,p))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}